home *** CD-ROM | disk | FTP | other *** search
/ BMUG PD-ROM 1995 Fall / PD-ROM F95.toast / Programming / Programming Languages / UCB Logo 3.0 ƒ / sources / standard source / logo.h < prev    next >
Encoding:
C/C++ Source or Header  |  1993-08-14  |  13.2 KB  |  400 lines  |  [TEXT/ttxt]

  1. /*
  2.  *      logo.h          logo header file                dvb
  3.  *
  4.  *    Copyright (C) 1993 by the Regents of the University of California
  5.  *
  6.  *      This program is free software; you can redistribute it and/or modify
  7.  *      it under the terms of the GNU General Public License as published by
  8.  *      the Free Software Foundation; either version 2 of the License, or
  9.  *      (at your option) any later version.
  10.  *  
  11.  *      This program is distributed in the hope that it will be useful,
  12.  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  *      GNU General Public License for more details.
  15.  *  
  16.  *      You should have received a copy of the GNU General Public License
  17.  *      along with this program; if not, write to the Free Software
  18.  *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  *
  20.  */
  21.  
  22. /* #define MEM_DEBUG */
  23.  
  24. /* #define ecma    /* for European extended character set using parity bit */
  25.  
  26. /* #define unix   /* This should be done automatically by gcc! */
  27. /* #define ultrix /* no usleep */
  28.  
  29. #ifdef THINK_C
  30. #define mac
  31. #endif
  32.  
  33. #ifdef __TURBOC__
  34. #define ibm
  35. #endif
  36.  
  37. #ifdef __ZTC__
  38. #define ibm
  39. #endif
  40.  
  41. #ifdef unix
  42. #ifndef NOGRAPH
  43. #define x_window    /* turn this off for no graphics */
  44. #endif
  45. #endif
  46.  
  47. #ifdef vax
  48. #define bsd
  49. #endif
  50.  
  51. #ifdef sun
  52. #define bsd
  53. #endif
  54.  
  55. /* #define SYSV */    /* turn this on for inferior AT&T brand Unix */
  56.  
  57. #include <stdio.h>
  58. #include <string.h>
  59. #include <signal.h>
  60. #ifndef mips
  61. #include <stdlib.h>
  62. #else
  63. #include <sys/types.h>
  64. #include <malloc.h>
  65. extern char *getenv();
  66. #endif
  67.  
  68. #ifdef ibm
  69. #include <dos.h>
  70. #endif
  71.  
  72. #ifdef mac
  73. #define check_throwing (check_mac_stop() || stopping_flag == THROWING)
  74. #else
  75. #ifdef ibm
  76. #define check_throwing (check_ibm_stop() || stopping_flag == THROWING)
  77. #else
  78. #define check_throwing (stopping_flag == THROWING)
  79. #endif
  80. #endif
  81.  
  82. typedef enum {wrapmode, fencemode, windowmode} mode_type;
  83.  
  84. #define WORDSIZE    32    /* bits per int */
  85.  
  86. #define NIL             (NODE *) 0
  87. #define UNBOUND         Unbound
  88. #define UNDEFINED       Unbound
  89. #define END_OF_LIST     (NODE *) 2
  90. #define HASH_LEN        1021    /* a prime number */
  91. #define SEG_SIZE        1000
  92. #define MAX_PHYS_LINE   5000
  93. #define MAX_NUMBER      50    /* max number of digits in a float */
  94. #define PREFIX_PRIORITY 2
  95. #define MACRO_PRIORITY    1
  96. #define TAIL_PRIORITY    0
  97.  
  98. typedef short NODETYPES;
  99.  
  100. /* Note that some of these values are used twice; they must be
  101.  * distinguishable by the other bits used with them. */
  102.  
  103. #define NT_TREE           (NODETYPES)0100000
  104. #define NT_EMPTY    (NODETYPES)040000
  105. #define NT_AGGR        (NODETYPES)020000
  106. #define NT_LIST        (NODETYPES)010000
  107. #define NT_RUNP        (NODETYPES)004000
  108. #define NT_ARRAY    (NODETYPES)002000
  109. #define NT_WORD        (NODETYPES)001000
  110. #define NT_NUMBER    (NODETYPES)000400
  111. #define NT_FLOAT    (NODETYPES)000200
  112. #define NT_CONT         (NODETYPES)000200
  113. #define NT_PRIM        (NODETYPES)000100
  114. #define NT_INFIX    (NODETYPES)000040
  115. #define NT_LINE            (NODETYPES)000040
  116. #define NT_VBAR        (NODETYPES)000040
  117. #define NT_STRING    (NODETYPES)000020
  118. #define NT_BACKSL    (NODETYPES)000010
  119. #define NT_PUNCT    (NODETYPES)000004
  120. #define NT_TAILFORM    (NODETYPES)000004
  121. #define NT_COLON    (NODETYPES)000002
  122. #define NT_MACRO        (NODETYPES)000002
  123. #define NT_CASEOBJ    (NODETYPES)000001
  124.  
  125. #define    PNIL        (NODETYPES)(NT_EMPTY|NT_AGGR|NT_LIST)
  126. #define PUNBOUND    (NODETYPES)0
  127. #define CONS        (NODETYPES)(NT_AGGR|NT_LIST)
  128. #define STRING        (NODETYPES)(NT_WORD|NT_STRING)
  129. #define INT        (NODETYPES)(NT_WORD|NT_NUMBER)
  130. #define FLOAT        (NODETYPES)(NT_WORD|NT_NUMBER|NT_FLOAT)
  131. #define PRIM        (NODETYPES)(NT_PRIM)
  132. #define MACRO        (NODETYPES)(NT_PRIM|NT_MACRO)
  133. #define TAILFORM    (NODETYPES)(NT_PRIM|NT_TAILFORM)
  134. #define CASEOBJ        (NODETYPES)(NT_WORD|NT_CASEOBJ)
  135. #define INFIX        (NODETYPES)(NT_PRIM|NT_INFIX)
  136. #define TREE        (NODETYPES)(NT_AGGR|NT_LIST|NT_TREE)
  137. #define RUN_PARSE    (NODETYPES)(NT_AGGR|NT_LIST|NT_RUNP)
  138. #define QUOTE        (NODETYPES)(NT_WORD|NT_PUNCT)
  139. #define COLON        (NODETYPES)(NT_WORD|NT_PUNCT|NT_COLON)
  140. #define BACKSLASH_STRING (NODETYPES)(NT_WORD|NT_STRING|NT_BACKSL)
  141. #define VBAR_STRING    (NODETYPES)(NT_WORD|NT_STRING|NT_BACKSL|NT_VBAR)
  142. #define ARRAY        (NODETYPES)(NT_AGGR|NT_ARRAY)
  143. #define LINE        (NODETYPES)(NT_LINE|NT_LIST|NT_AGGR)
  144. #define CONT        (NODETYPES)(NT_CONT|NT_LIST)
  145. #define aggregate(nd)    (nodetype(nd) & NT_AGGR)
  146. #define is_cont(nd)    (nodetype(nd) == CONT)
  147. #define is_list(nd)    (nodetype(nd) & NT_LIST)
  148. #define is_tree(nd)    (nodetype(nd) & NT_TREE)
  149. #define is_string(nd)    (nodetype(nd) & NT_STRING)
  150. #define is_number(nd)    (nodetype(nd) & NT_NUMBER)
  151. #define is_prim(nd)    (nodetype(nd) & NT_PRIM)
  152. #define is_word(nd)    (nodetype(nd) & NT_WORD)
  153. #define runparsed(nd)    (nodetype(nd) & NT_RUNP)
  154. #define backslashed(nd)    (nodetype(nd) & NT_BACKSL)
  155. #define is_tailform(nd)    (nodetype(nd) == TAILFORM)
  156.  
  157. typedef enum { FATAL, OUT_OF_MEM, STACK_OVERFLOW, TURTLE_OUT_OF_BOUNDS,
  158.               BAD_DATA_UNREC, DIDNT_OUTPUT, NOT_ENOUGH, BAD_DATA, TOO_MUCH,
  159.               DK_WHAT, PAREN_MISMATCH, NO_VALUE, UNEXPECTED_PAREN, DK_HOW,
  160.             NO_CATCH_TAG, ALREADY_DEFINED, STOP_ERROR, ALREADY_DRIBBLING,
  161.             FILE_ERROR, IF_WARNING, SHADOW_WARN, USER_ERR, IS_PRIM,
  162.             NOT_INSIDE, DK_HOW_UNREC, NO_TEST, UNEXPECTED_BRACKET,
  163.             UNEXPECTED_BRACE, BAD_GRAPH_INIT, ERR_MACRO,
  164.             DK_WHAT_UP, AT_TOPLEVEL, APPLY_BAD_DATA} ERR_TYPES;
  165.  
  166. typedef int BOOLEAN;
  167.  
  168. #define FALSE    0
  169. #define TRUE    1
  170.  
  171. #define even_p(x) !(x & 0x1)
  172.  
  173. #define FIXNUM          long
  174. #define FLONUM          double
  175. #define MAXINT        0x7fffffff
  176. #define SAFEINT        0x00003fff  /* safe to multiply w/o overflow */
  177.  
  178. typedef struct logo_node {
  179.     NODETYPES node_type;
  180. /*    char gc_flags;    */
  181.     short ref_count;
  182.     union {
  183.         struct {
  184.             struct logo_node *ncar;
  185.             struct logo_node *ncdr;
  186.             struct logo_node *nobj;         /* used only for oblist */
  187.         } ncons;
  188.         struct {
  189.             char *nstring_ptr;
  190.             char *nstring_head;
  191.             int nstring_len;
  192.         } nstring;
  193.         struct {
  194.             struct logo_node * (*nprim_fun) ();
  195.             short npriority;
  196.             short nmin_args;
  197.             short ndef_args;
  198.             short nmax_args;
  199.         } nprim;
  200.         FIXNUM nint;
  201.         FLONUM nfloat;
  202.         struct {
  203.             int narray_dim;
  204.             int narray_origin;
  205.             struct logo_node **narray_data;
  206.         } narray;
  207.     } nunion;
  208. } NODE;
  209.  
  210. #define settype(node, type)     ((node)->node_type = (type))
  211.  
  212. #define getrefcnt(node)         ((node)->ref_count)
  213. #define setrefcnt(node,val)     ((node)->ref_count = (val))
  214. #define increfcnt(node)         (((node)->ref_count)++)
  215. #define decrefcnt(node)         (--((node)->ref_count))
  216.  
  217. #define n_car                   nunion.ncons.ncar
  218. #define n_cdr                   nunion.ncons.ncdr
  219. #define n_obj                   nunion.ncons.nobj
  220. #define getobject(node)         ((node)->n_obj)
  221. #define car(node)               ((node)->n_car)
  222. #define cdr(node)               ((node)->n_cdr)
  223. #define caar(node)              ((node)->n_car->n_car)
  224. #define cadr(node)              ((node)->n_cdr->n_car)
  225. #define cdar(node)              ((node)->n_car->n_cdr)
  226. #define cddr(node)              ((node)->n_cdr->n_cdr)
  227.  
  228. #define n_str                   nunion.nstring.nstring_ptr
  229. #define n_len                   nunion.nstring.nstring_len
  230. #define n_head                  nunion.nstring.nstring_head
  231. #define getstrptr(node)         ((node)->n_str)
  232. #define getstrlen(node)         ((node)->n_len)
  233. #define getstrhead(node)        ((node)->n_head)
  234. #define setstrptr(node,ptr)     ((node)->n_str = (ptr))
  235. #define setstrlen(node,len)     ((node)->n_len = (len))
  236. #define setstrhead(node,ptr)    ((node)->n_head = (ptr))
  237.  
  238. #define getstrrefcnt(sh)        (*sh)
  239. #define setstrrefcnt(sh, v)     (*sh = (v))
  240. #define incstrrefcnt(sh)        ((*sh)++)
  241. #define decstrrefcnt(sh)        (--(*sh))
  242.  
  243. #define n_int                   nunion.nint
  244. #define getint(node)            ((node)->n_int)
  245. #define setint(node,num)        ((node)->n_int = (num))
  246.  
  247. #define n_float                 nunion.nfloat
  248. #define getfloat(node)          ((node)->n_float)
  249. #define setfloat(node,num)      ((node)->n_float = (num))
  250.  
  251. #define n_pfun                  nunion.nprim.nprim_fun
  252. #define n_ppri                  nunion.nprim.npriority
  253. #define n_pmin                  nunion.nprim.nmin_args
  254. #define n_pdef                  nunion.nprim.ndef_args
  255. #define n_pmax                  nunion.nprim.nmax_args
  256. #define getprimfun(node)        ((node)->n_pfun)
  257. #define setprimfun(node,fun)    ((node)->n_pfun = (fun))
  258. #define getprimmin(node)        ((node)->n_pmin)
  259. #define setprimmin(node,num)    ((node)->n_pmin = (num))
  260. #define getprimmax(node)        ((node)->n_pmax)
  261. #define setprimmax(node,num)    ((node)->n_pmax = (num))
  262. #define getprimdflt(node)       ((node)->n_pdef)
  263. #define setprimdflt(node,num)   ((node)->n_pdef = (num))
  264. #define getprimpri(node)        ((node)->n_ppri)
  265. #define setprimpri(node,num)    ((node)->n_ppri = (num))
  266. /* Special value for pmin, means that it's
  267.  *  OK if primitive name on line by itself even though defltargs=1 (ED, CO) */
  268. #define OK_NO_ARG    01000
  269.  
  270. #define n_dim            nunion.narray.narray_dim
  271. #define n_org            nunion.narray.narray_origin
  272. #define n_array            nunion.narray.narray_data
  273. #define getarrdim(node)        ((node)->n_dim)
  274. #define getarrorg(node)        ((node)->n_org)
  275. #define getarrptr(node)        ((node)->n_array)
  276. #define setarrdim(node,len)    ((node)->n_dim = (len))
  277. #define setarrorg(node,org)    ((node)->n_org = (org))
  278. #define setarrptr(node,ptr)    ((node)->n_array = (ptr))
  279.  
  280. #ifdef ecma
  281. #define clearparity(ch)        ecma_clear(ch)
  282. #define setparity(ch)        ecma_set(ch)
  283. #define getparity(ch)        ecma_get(ch)
  284. #else
  285. #define clearparity(ch)         (ch & 0x7f)
  286. #define setparity(ch)           (ch | 0x80)
  287. #define getparity(ch)           (ch & 0x80)
  288. #endif
  289.  
  290. typedef enum { RUN, STOP, OUTPUT, THROWING, MACRO_RETURN } CTRLTYPE;
  291.  
  292. struct segment {
  293.     struct segment *next;
  294.     struct logo_node nodes[SEG_SIZE]; };
  295.  
  296. #define NOT_THROWING            (stopping_flag != THROWING)
  297. #define RUNNING                 (stopping_flag == RUN)
  298. #define STOPPING                (stopping_flag == STOP)
  299.  
  300. #define canonical__object(o)    car(o)
  301. #define procnode__object(o)     cadr(o)
  302. #define setprocnode__object(o,v) setcar(cdr(o), v)
  303. #define valnode__object(o)      cadr(cdr(o))
  304. #define setvalnode__object(o,v) setcar(cddr(o), v)
  305. #define plist__object(o)        cadr(cddr(o))
  306. #define setplist__object(o,v)    setcar(cdr(cddr(o)), v)
  307. #define obflags__object(o)    car(cddr(cddr(o)))
  308. #define caselistptr__object(o)  cddr(cddr(o))
  309. #define caselist__object(o)     cdr(cddr(cddr(o)))
  310.  
  311. #define strnode__caseobj(co)    car(co)
  312. #define object__caseobj(c)      cdr(c)
  313. #define procnode__caseobj(c)    procnode__object(object__caseobj(c))
  314. #define setprocnode__caseobj(c,v) setprocnode__object(object__caseobj(c),v)
  315. #define valnode__caseobj(c)    valnode__object(object__caseobj(c))
  316. #define setvalnode__caseobj(c,v) setvalnode__object(object__caseobj(c),v)
  317. #define plist__caseobj(c)    plist__object(object__caseobj(c))
  318. #define setplist__caseobj(c,v)    setplist__object(object__caseobj(c),v)
  319. #define obflags__caseobj(c)    obflags__object(object__caseobj(c))
  320.  
  321. #define text__procnode(p)    car(p)
  322. #define formals__procnode(p)    caar(p)
  323. #define bodylist__procnode(p)   cdar(p)
  324. #define dfltargs__procnode(p)   cadr(cddr(p))
  325. #define minargs__procnode(p)    car(cddr(p))
  326. #define maxargs__procnode(p)    car(cddr(cddr(p)))
  327. #define bodywords__procnode(p)  cadr(p)
  328. #define setbodywords__procnode(p,v) setcar(cdr(p),v)
  329.  
  330. #define unparsed__runparse(rn)  rn
  331. #define parsed__runparse(rn)    getobject(rn)
  332. #define node__quote(q)          car(q)
  333. #define node__colon(c)          car(c)
  334. #define valnode__colon(c)       valnode__caseobj(node__colon(c))
  335.  
  336. #define unparsed__tree(t)    t
  337. #define treepair__tree(t)    getobject(t)
  338. #define settreepair__tree(t, v)    setobject(t, v)
  339. #define generation__tree(t)    car(treepair__tree(t))
  340. #define setgeneration__tree(t, g) setcar(treepair__tree(t), g)
  341. #define tree__tree(t)        cdr(treepair__tree(t))
  342. #define settree__tree(t, v)    settreepair__tree(t, cons(the_generation, v))
  343.  
  344. #define unparsed__line(l)    getobject(l)
  345. #define tree__line(l)        l
  346.  
  347. #define cont__cont(c)        (int)car(c)
  348. #define val__cont(c)        cdr(c)
  349.  
  350. /* Object flags.  Ones settable by users via bury_helper must come in threes
  351.  * for proc, val, plist even if meaningless for some of those. */
  352. #define PROC_BURIED    01
  353. #define VAL_BURIED    02
  354. #define PLIST_BURIED    04
  355. #define PROC_TRACED    010
  356. #define VAL_TRACED    020
  357. #define PLIST_TRACED    040
  358. #define PROC_STEPPED    0100
  359. #define VAL_STEPPED    0200
  360. #define PLIST_STEPPED    0400
  361. #define PROC_MACRO    01000
  362.  
  363. #define setflag__caseobj(c,f) ((obflags__caseobj(c))->n_int |= (f))
  364. #define clearflag__caseobj(c,f) ((obflags__caseobj(c))->n_int &= ~(f))
  365. #define flag__caseobj(c,f) (int)((obflags__caseobj(c))->n_int & (f))
  366. #define flag__object(o,f) (int)((obflags__object(o))->n_int & (f))
  367. #define is_macro(c) (flag__caseobj(c, PROC_MACRO))
  368.  
  369. #define reref(o1, o2)   _reref(o1, o2)
  370.  
  371. #define ref(o)        if (o != NIL) increfcnt(o)
  372. #define vref(o)        ((o != NIL) ? ((increfcnt(o)) , o) : NIL)
  373. #define deref(o)    if (o != NIL && decrefcnt(o) == 0) \
  374.                 gc(o)
  375. #define gcref(o)    if (o != NIL && getrefcnt(o) == 0) \
  376.                 gc(o)
  377.  
  378. #define push(obj, stack)    spush(obj, &stack)
  379. #define pop(stack)        spop(&stack)
  380.  
  381. /* evaluator labels, needed by macros in other files */
  382.  
  383. #define do_list(x) \
  384.     x(all_done) \
  385.     x(begin_line) x(end_line) x(begin_seq) x(begin_apply) \
  386.     x(eval_sequence_continue) \
  387.     x(accumulate_arg) x(compound_apply_continue) \
  388.     x(set_args_continue) x(macro_return) \
  389.     x(qm_continue) \
  390.     x(runresult_continuation) x(runresult_followup) \
  391.     x(repeat_continuation) x(repeat_followup) \
  392.     x(catch_continuation) x(catch_followup)
  393.  
  394. #define do_enum(x) x,
  395.  
  396. enum labels {
  397.     do_list(do_enum)
  398.     NUM_TOKENS
  399. };
  400.